/*
    1.promise 就是一个类，在执行这个类的时候，需要传递一个执行器进去，执行器立即执行
    2.promise 中有三种状态，分别为 fulfilled rejected pending
    pending -> fulfilled
    pending -> rejected
    一旦状态确定就不可更改
    3.resolve 和 reject 函数是用来更改状态的
    resolve： fulfilled
    reject：rejected
    4. then方法内部做的事情就是判断当前状态：如果状态是成功，调用成功的回调函数；如果状态是失败，调用失败的回调函数;then 方法是被定义在原型对象中的 
    5. then成功回调有一个参数，标识成功之后的值;then失败回调有一个参数，表示失败后的原因
    6. then可以多次连续调用
    7. then方法是可以被链式调用的，后面then方法的回调函数拿到值的是上一个then方法的回调函数的值
    8. then方法的参数可以变成可选参数
    9. finally 无论状态是否成功，finally方式都会被执行一次；可以链式调用then方法，拿到当前promise对象最终返回的结果
*/

const MyPromise = require('./MyPromise')
// let promise = new Promise((resolve, reject) => {
//     // 测试等待的情况
//     // setTimeout(() => {
//     //     resolve('成功...')
//     // },1000)
//     // throw new Error('executor error')
//     resolve(100)
//     // reject('失败')
// })
function p2() {
    return new MyPromise(function(resolve, reject) {
        // resolve('p2 resolve')
        reject('p2 reject')
    }) 
}
// 测试 catch
p2()
    .then(value => console.log(value))
    .catch(reason => console.log(reason))
// 测试 finally 有问题
// p2().finally( () => {
//     console.log('finally')
// }).then(value =>{
//     console.log(value)
// }, reason => {
//     console.log(reason)
// })
// 测试Promise.resolve
// MyPromise.resolve(100).then(value => console.log(value))

// 测试Promise.all() 有问题
// function p1() {
//     return new MyPromise(function(resolve, reject) {
//         setTimeout(() => {
//             resolve('p1')
//         },2000)
//     }) 
// }

// MyPromise.all(['1','b', p1(), p2(), 'c'])
//     .then(resolve => {
//         console.log(1)
//     console.log(resolve)
// })
// 测试then不传递参数
// promise.then().then().then( value => console.log(value))
// promise.then().then().then( value => console.log(value), reason => {console.log(reason)})
// 捕获错误
// promise.then((value) => {
//     console.log(value)
//     // throw new Error('then error')
//     return 'aaa'
// }, (reason) => {
//     console.log(reason.message)
//     return 10000
// }).then(value => {
//     console.log(value)
// })

// 链式测试
// function other() {
//     return new MyPromise((resolve, reject) => {
//         resolve('other',resolve)
//     })
// }
// promise.then((value) => {
//     console.log(value)
//     return other(value)
//     // return 100
// }).then(value => {
//     console.log('链式',value)
// })
// 测试自己返回自己
// let p1 =promise.then(value => {
//     console.log(value)
//     return p1;
// })
// p1.then(value => {
//     console.log(value)
// }, reason => {
//     console.log(reason.message)
// })
//测试多个then回调
// promise.then((value) => {
//     console.log(value)
// }, (reason) => {
//     console.log(reason)
// })
// promise.then((value) => {
//     console.log(value)
// }, (reason) => {
//     console.log(reason)
// })

// promise.then((value) => {
//     console.log(value)
// }, (reason) => {
//     console.log(reason)
// })


